/**
* \file		Caracteristiques.h
* \brief	Définit la structure Caracteristiques
* \details	C'est ici que sont définis la structure Caracteristiques, ses
*		accesseurs, ses mutateurs.
*/

#ifndef CARACTERISTIQUES_H
#define CARACTERISTIQUES_H

/**
* \brief	Informations définissant les Caractéristiques d'un personnage.
* \details	Cette structure comporte les différentes caractéristiques 
*		définissant l'état d'un personnage et ses connaissances. Le
*		seuil maximal pour les compétences est de 500.
*/

typedef struct
{
  unsigned int PV;	/*!<nombre de points de vie ; si tombe à zéro, le
			personnage meurt : entier entre 0 et 200, la valeur
			initiale (avant effets de la faim ou autres) est de
			130 plus un entier compris entre 0 et 40) */
  unsigned int minage;	/*!<compétence en minage : entier */
  unsigned int bucheronnage;	/*!<compétence en bucheronnage : entier */
  unsigned int artisanat;	/*!<compétence en artisanat : entier */
  unsigned int faim;	/*!<état de faim (un nain qui a faim pioche dans la
 			réserve) : entier compris entre 0 et 100, pour une
			valeur initiale (avant effets du temps ou autres) de
			50 plus un nombre compris entre 0 et 20, plus le
			nombre est proche de 0, plus le nain a faim un nain
			ayant 0 en faim commence à perdre des points de vie*/
  } Caracteristiques;

/*========================== Gestion de la mémoire ==========================*/

/**
* \brief	Initialise un ensemble de caractéristiques.
* \details	Initialise le nombre de points de vie, les compétences, et
*		l'état de faim, sur le principe d'une valeur de base	
*		additionnée à une valeur tirée aléatoirement
* \param	pcarac	Un pointeur sur Caracteristiques
*/
void initCaract(Caracteristiques *pcarac);

/**
* \brief	Crée un ensemble de caractéristiques, alloue la structure dans
*		le tas et l'initialise grâce à initCarac
* \param	pcarac	Un pointeur sur adresse de Caracteristiques
*/
void creerCaract(Caracteristiques **pcarac);

/**
* \brief	Libère la mémoire allouée pour une Caracteristiques donnée
* \param	pcarac	Un pointeur sur Caracteristiques
*/
void detruireCaract(Caracteristiques *pcarac);


/*============================= Accesseurs =============================*/
/**
* \brief	Retourne le nombre de points de vie
* \details	Récupère le nombre de points de vie d'une Caractéristiques
*		donnée en vérifiant sa validité
* \param	pcarac	Un pointeur sur Caracteristiques
* \return	Un entier non signé
*/
unsigned int getPV(const Caracteristiques *pcarac);

/**
* \brief	Retourne la valeur associée à la compétence de minage
* \details	Récupère la valeur de minage d'une Caractéristiques donnée en
*		vérifiant sa validité
* \param	pcarac	Un pointeur sur Caracteristiques
* \return	Un entier non signé
*/
unsigned int getMinage(const Caracteristiques *pcarac);

/**
* \brief	Retourne la valeur associée à la compétence de bucheronnage
* \details	Récupère la valeur de bucheronnage d'une Caractéristiques
*		donnée en vérifiant sa validité
* \param	pcarac	Une Caracteristiques
* \return	Un entier non signé
*/
unsigned int getBucheronnage(const Caracteristiques *pcarac);

/**
* \brief	Retourne la valeur associée à la compétence d'artisanat
* \details	Récupère la valeur d'artisanat d'une Caractéristiques donnée
*		en vérifiant sa validité
* \param	pcarac	Un pointeur sur Caracteristiques
* \return	Un entier non signé
*/
unsigned int getArtisanat(const Caracteristiques *pcarac);

/**
* \brief	Retourne la valeur faim
* \details	Récupère l'état de faim du personnage auquelles ces 	
*		caractéristiques correspondent. 
* \param	pcarac	Un pointeur sur Caracteristiques
* \return	Un entier non signé
*/
unsigned int getFaim(const Caracteristiques *pcarac);

/*============================= Mutateurs =============================*/

/**
* \brief	Change "PV" d'une valeur donnée
* \details	Ajoute à la valeur actuelle de "PV" une valeur entière passée
*		en argument, après vérification (le résultat ne peut être
*		négatif)
* \param	pcarac	Un pointeur sur Caracteristiques
* \param	varPV	Un entier. Une valeur positive s'ajoutera à la valeur
*		actuelle de la caratéristique ; pour diminuer la valeur
*		actuelle, passer une valeur négative.
*/
void ajoutePV(Caracteristiques *pcarac, int varPV);

/**
* \brief	Change "Minage" d'une valeur donnée
* \details	Ajoute à la valeur actuelle de "Minage" une valeur entière
* 		passée en argument, après vérification (le résultat ne peut
*		être négatif)
* \param	pcarac		Un pointeur sur Caracteristiques
* \param	varMinage	Un entier. Une valeur positive s'ajoutera à
*				la valeur actuelle de la caratéristique ;
*				pour diminuer la valeur actuelle, passer une
*				valeur négative.
*/
void ajouteMinage(Caracteristiques *pcarac, int varMinage);

/**
* \brief	Change "Bucheronnage" d'une valeur donnée
* \details	Ajoute à la valeur actuelle de "Bucheronnage" une valeur
*		entière passée en argument, après vérification (le résultat
*		ne peut être négatif)
* \param	carac		Un pointeur sur Caracteristiques
* \param	varBucheronnage	Un entier. Une valeur positive s'ajoutera à
*				la valeur actuelle de la caratéristique ;
*				pour diminuer la valeur actuelle, passer une
*				valeur négative.
*/
void ajouteBucheronnage(Caracteristiques *pcarac, int varBucheronnage);

/**
* \brief	Change "Artisanat" d'une valeur donnée
* \details	Ajoute à la valeur actuelle d'"Artisanat" une valeur
*		entière passée en argument, après vérification (le résultat
*		ne peut être négatif)
* \param	pcarac		Un pointeur sur Caracteristiques
* \param	varArtisanat	Un entier. Une valeur positive s'ajoutera à
*				la valeur actuelle de la caratéristique ;
*				pour diminuer la valeur actuelle, passer une
*				valeur négative.
*/
void ajouteArtisanat(Caracteristiques *pcarac, int varArtisanat);


/**
* \brief	Change "Faim" d'une valeur donnée
* \details	Ajoute à la valeur actuelle de "Faim" une valeur
*		entière passée en argument, après vérification (le résultat
*		ne peut être négatif)
* \param	pcarac		Un pointeur sur Caracteristiques
* \param	varFaim		Un entier. Une valeur positive s'ajoutera à
*				la valeur actuelle de la caratéristique ;
*				pour diminuer la valeur actuelle, passer une
*				valeur négative.
*/
void ajouteFaim(Caracteristiques *pcarac, int varFaim);

/*========================== Fonction de Test ==========================*/
/**
* \brief	Teste les différentes fonctions du module Caracteristiques
* \details	Teste les différentes fonctions du module Caracteristiques en 			les utilisant avec diverses valeurs plus ou moins probables
* \param	carac		Une Caracteristiques
*/
void testCaracteristiques();

#endif
